﻿#ifndef __H_LOGRECORD_H__
#define __H_LOGRECORD_H__

#include "LogRecord_global.h"

#include <QByteArray>
#include <QDateTime>
#include <QFile>
#include <QTextStream>
#include <QCoreApplication>
#include <QDir>
#include <QDebug>

#ifdef Q_OS_WIN

#include <tchar.h>
#include <Windows.h>
#include <DbgHelp.h>

#endif

class LOGRECORD_EXPORT LogRecord
{
public:

    /**
    * \fn	void LogMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
    *
    * \brief	日志输出.
    *
    * \author	zhanghs
    * \date	2020/8/6
    *
    * \param	type   	日志输出类型.
    * \param	context	日志输出来源.
    * \param	msg	   	日志内容.
    */
    static void logMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);

    /**
    * \enum	LogLevel
    *
    * \brief	日志等级.
    */
    enum LogLevel
    {
        LL_Debug,		// 调试信息
        LL_Info,		// 一般信息
        LL_Warning,		// 警告信息
        LL_Error,	// 严重信息
        LL_Fatal,		// 程序错误信息
    };

    /**
    * \fn	QFile* createLogFile()
    *
    * \brief	创建一个日志文件.
    *
    * \author	zhanghs
    * \date	2020/8/6
    *
    * \return	返回日志文件地址.
    */
    static QFile* createLogFile();

    /**
    * \fn	QFile* GetLogFile()
    *
    * \brief	获取日志文件对象.
    *
    * \author	zhanghs
    * \date	2020/8/6
    *
    * \return	返回日志文件地址.
    */
    static QFile* getLogFile();

    /**
    * \fn	void WriteFile(QString msgType, const QMessageLogContext &context, const QString & msg)
    *
    * \brief	日志文件编写.
    *
    * \author	zhanghs
    * \date	2020/2/10
    *
    * \param	msgType	消息类型字符串.
    * \param	context	输出函数.
    * \param	msg	   	输出消息内容.
    */
    static void writeFile(QString msgType, const QMessageLogContext &context, const QString& msg);

    /**
    * \fn	int transformLogLevel(QtMsgType type)
    *
    * \brief	转换日志等级.
    *
    * \author	zhanghs
    * \date	2020/2/10
    *
    * \param	type	输出的消息.
    *
    * \return	返回日志等级.
    */
    static int transformLogLevel(QtMsgType type);


};


#ifdef Q_OS_WIN

/**************************************************************************************************
* \fn  int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
* \brief   生成最小Dump文件.
* \author  张海思
* \date    2021/2/6
* \param   pExceptionPointers  异常指针.
* \return  异常返回值.
**************************************************************************************************/

int LOGRECORD_EXPORT GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers);

/*************************************************************************************************
* \fn  LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
* \brief   异常筛选.
* \author  Zhanghs
* \date    2021/2/6
* \param   lpExceptionInfo 异常信息.
* \return  异常返回值.
**************************************************************************************************/

LONG LOGRECORD_EXPORT ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo);

#endif



#endif // __H_LOGRECORD_H__
